package hch.redesFerroviarias;

import hch.utils.Sentido;

import java.util.concurrent.locks.Condition;


public class Pasajero extends Thread{
	private int id;
	private int estacionSalida;
	private int estacionDestino;
	private Sentido sentido;
	private Condition estaEnViaje = RedFerroviaria.LOCK.newCondition();	
	
	public Pasajero(int id, int estacionSalida, int estacionDestino){
		this.id = id;
		this.estacionSalida = estacionSalida;
		this.estacionDestino = estacionDestino;
		this.sentido = this.obtenerSentido();
		System.out.println(this);
	}

	//*************//
	//** METHODS **//
	//*************//
	private Sentido obtenerSentido(){
		int recorridoIzq = 0;
		int recorridoDer = 0;
		if(this.estacionSalida < this.estacionDestino){
			recorridoIzq = RedFerroviaria.NroESTACIONES + this.estacionSalida - this.estacionDestino;
			recorridoDer = this.estacionDestino - this.estacionSalida;
		}else{
			recorridoIzq = this.estacionSalida - this.estacionDestino;
			recorridoDer = RedFerroviaria.NroESTACIONES + this.estacionDestino - this.estacionSalida;
		}
		if(recorridoDer > recorridoIzq)
			return Sentido.IZQUIERDA;
		else
			return Sentido.DERECHA;
	}
	
	/*private Sentido obtenerSentido(){
		int recorridosDerecha = estacionDestino - estacionSalida;
		if(recorridosDerecha < 0)
			recorridosDerecha += RedFerroviaria.NroESTACIONES;
		int recorridosIzquierda = RedFerroviaria.NroESTACIONES - recorridosDerecha;
		if( recorridosIzquierda < recorridosDerecha)
			return Sentido.IZQUIERDA;
		return Sentido.DERECHA;
	}*/
	
	@Override
	public void run() {
		while(true){
			RedFerroviaria.LOCK.lock();
			try {
				Estacion estacion = RedFerroviaria.ESTACIONES.get(this.estacionSalida-1);
				RedFerroviaria.CONDICIONES[this.estacionSalida-1].await();
				Tren tren = estacion.getTrenes().get(0);
				if(tren.getCapacidadActual() < tren.getCapacidadMax() && tren.getSentido() == this.sentido){
					tren.agregarPasajero(this);
					estacion.restarPasajero();
					this.estaEnViaje.await();
				}
			} catch (InterruptedException e) {}
			RedFerroviaria.LOCK.unlock();
		}
	}
	
	//**************//
	//** ACCESORS **//
	//**************//	
	public int getEstacionDestino() {
		return estacionDestino;
	}
	
	public Condition getEstaEnViaje() {
		return estaEnViaje;
	}
	
	public Sentido getSentido() {
		return sentido;
	}
	
	public int getEstacionSalida() {
		return estacionSalida;
	}
	
	@Override
	public String toString() {
		return "Pasajero "+id + " espera en la Est: " +this.estacionSalida+ " el tren con sentido: " + this.getSentido()+ " para llegar a la Est:" + +this.estacionDestino;
	}
}
